home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d894.lha / AntiRascism / AntiRaBB / Source / AntiRaBB.asm < prev    next >
Assembly Source File  |  1993-05-16  |  42KB  |  1,727 lines

  1. ***    BUG: mi_NextSelect wird nicht unterstützt
  2.  
  3. ;;    *****************************************************************
  4.     *    Programm:    AntiRaBB                *
  5.     *            (installiert einen Bootblock, der den    *
  6.     *             Text "Gegen Rassismus!" ausgibt)    *
  7.     *    Copyright:    Freeware © von Hanns Holger Rutz (Tro-    *
  8.     *            picDesign)                *
  9.     *    History:    30.01.-05.02.1993 erste Version        *
  10.     *            11.04.1993      minor bug removed    *
  11.     *****************************************************************
  12.  
  13. ;;-- Includes --
  14.  
  15.         incdir    'sys:asm/inc/'
  16.         include    'devices/bootblock.i'
  17.         include    'devices/trackdisk.i'
  18.         include    'dos/dosextens.i'
  19.         include    'exec/execbase.i'
  20.         include    'exec/memory.i'
  21.         include    'intuition/intuition.i'
  22.         include    'private/exec_lib.i'
  23.         include    'private/gfx_lib.i'
  24.         include    'private/intuition_lib.i'
  25.  
  26. ;;-- Macros --
  27.  
  28. exec        macro
  29.         if NARG
  30.             move.l    4.w,\1
  31.         else
  32.             movea.l    4.w,lb
  33.         endc
  34.         endm
  35.  
  36. slib        macro
  37.         if NARG>1
  38.             move.l    gl_\1Base(gl),\2
  39.         else
  40.             movea.l    gl_\1Base(gl),lb
  41.         endc
  42.         endm
  43.  
  44. fjsr        macro
  45.         jsr    _LVO\1(lb)
  46.         endm
  47.  
  48. push        macro
  49.         movem.l    \1,-(sp)
  50.         endm
  51.  
  52. pull        macro
  53.         movem.l    (sp)+,\1
  54.         endm
  55.  
  56. rsword        macro
  57. .addr        rs.b    0
  58.         rs.b    .addr&1        eventuell auf WORD-Länge aufrunden
  59.         endm
  60.  
  61. rslong        macro
  62. .addr        rs.b    0
  63.         rs.b    (-.addr)&3    eventuell auf LONG-Länge aufrunden
  64.         endm
  65.  
  66. version        macro
  67.         dc.b    '1.0b'        Version/Revision des Programms
  68.         endm
  69.  
  70. sbase        macro
  71. Base        set    *        Basis für soff-Definitionen festlegen
  72.         endm
  73.  
  74. soff        macro
  75. \1        set    ~(*-Base)    => ~\1+Base = Adresse
  76.         if NARG>1
  77. \2        set    *-Base        => gl_\1 = gl_SIZE-Off./chip_SIZE-Off.
  78.         endc
  79.         endm
  80.  
  81. ;;-- Konstanten --
  82.  
  83. lb        equr    a6        Librarybasis
  84. gl        equr    a5        globale Variablen
  85. GADGDISABLEDb    =    8        Bits für
  86. GRELBOTTOMb    =    3        ..Gadgetflags
  87. ITEMENABLEDb    =    4        Bits für
  88. COMMSEQb    =    2        ..MenuItem-Flags
  89. ITEMTEXTb    =    1
  90. BB_SIZEOF    =    TD_SECTOR*BOOTSECTS    Gesamtgröße des BB
  91.  
  92.         rsreset            ;\
  93. flo_IO        rs.b    IOTD_SIZE     / IORequest
  94. flo_Port    rs.b    MP_SIZE        ReplyPort
  95. flo_SIZEOF    rs.b    0
  96.  
  97. ;;-- Startup --
  98.  
  99. _Start        move.w    #((gl_SIZEOF-gl_SIZE)/2)-1,d0
  100.         lea.l    _GfxEnd(pc),a0            variablen Speicher
  101. .SetGlobal    move.w    -(a0),-(sp)            ..kopieren
  102.         dbf    d0,.SetGlobal
  103.         move.w    #(gl_SIZE/2)-1,d0
  104. .ClearGlobal    clr.w    -(sp)                globales VarMem anlegen
  105.         dbf    d0,.ClearGlobal
  106.         movea.l    sp,gl
  107.         move.b    #RETURN_FAIL,gl_Return(gl)    CLI-Returncode
  108.  
  109.         exec
  110.         movea.l    ThisTask(lb),a2
  111.         move.l    a2,gl_Process(gl)    Taskadresse sichern
  112.         tst.l    pr_CLI(a2)
  113.         bne.b    .Cont            ..CLI-Start
  114.         lea.l    pr_MsgPort(a2),a0
  115.         fjsr    WaitPort
  116.         lea.l    pr_MsgPort(a2),a0
  117.         fjsr    GetMsg
  118.         move.l    d0,gl_WBMsg(gl)        ..WB-Start, Msg sichern
  119. .Cont
  120.         bsr.w    _AllocChip        ChipMem besorgen
  121.         beq.b    _CleanUp        ..Fehler
  122.         bsr.w    _OpenLibs        Intui/Gfx-Lib öffnen
  123.         beq.b    _CleanUp        ..Fehler
  124.         bsr.w    _OpenTrackDisx        IORequests anlegen
  125.         beq.b    _CleanUp        ..keine Unit verfügbar
  126.         bsr.w    _OpenDisplay        Window etc. öffnen
  127.         beq.b    _CleanUp        ..Fehler
  128.  
  129. ;;-- Hauptschleife --
  130.  
  131. _Main        clr.b    gl_Return(gl)        Returncode = RETURN_OK
  132. _MainLoop    movea.l    gl_Window(gl),a0
  133.         bsr.w    _GetMsg            auf Message warten
  134.         cmpi.b    #3,d0
  135.         ble.w    _Install        ..Installieren
  136.         subq.b    #4,d0
  137.         beq.w    _Undo            ..Rückgängig machen
  138.         subq.b    #2,d0
  139.         beq.w    _Info            ..Info
  140.         ;||                ..Ende
  141. ;;-- Aufräumen --
  142.  
  143. _CleanUp    bsr.w    _CloseDisplay        alles wieder schließen
  144.         bsr.w    _CloseTrackDisx
  145.         bsr.w    _CloseLibs
  146.         bsr.w    _FreeChip
  147.  
  148. _Quit        move.l    gl_WBMsg(gl),d2
  149.         beq.b    .Cont            ..CLI-Start
  150.         exec
  151.         fjsr    Forbid            (ist sicherer)
  152.         movea.l    d2,a1
  153.         fjsr    ReplyMsg        StartupMsg beantworten
  154. .Cont        moveq.l    #0,d0
  155.         move.b    gl_Return(gl),d0    Returncode in d0
  156.         beq.b    .Exit            ..alles ok
  157.         movea.l    gl_Process(gl),a0
  158.         move.l    gl_Result2(gl),pr_Result2(a0)    2. Returncode setzen
  159. .Exit        lea.l    gl_SIZEOF(sp),sp        Stack korrigieren
  160.         rts                    Programmende
  161.  
  162. ;;-- Globaler Konstantenspeicher --
  163.  
  164. _Version    dc.b    '$VER: AntiRaBB '
  165.         version
  166.         dc.b    0
  167.         even
  168. _WriteBuf    incdir    'sys:asm/src/'
  169.         incbin    'AntiRaBB.bb'        BootCode (1012 Bytes)
  170.  
  171. ;;-- Informationsrequester --
  172. ;    ACHTUNG: nur von _Main über bcc anspringen!
  173.  
  174. _Info        push    a0/a1
  175.         lea.l    .InfoBody(pc),a0    Text
  176.         movea.l    gl_ChipMem(gl),a1    ..und Image
  177.         *lea.l    chip_Tropic(a1),a1    (=NULL)
  178.         bsr.w    _Request        ..als Requester darstellen
  179.         pull    a0/a1
  180.         bra.w    _MainLoop
  181.  
  182. .InfoBody    dc.b    '                    AntiRaBB ist ein',$0a
  183.         dc.b    '                    Freewareprogramm',$0a
  184.         dc.b    '                    © von Hanns Hol-',$0a
  185.         dc.b    '                    ger  Rutz.  Tro-',$0a
  186.         dc.b    '                    picDesign   sind',$0a
  187.         dc.b    'Hanns Holger Rutz  und  Marco Brink-',$0a
  188.         dc.b    'mann.  Lies das Doc-File für weitere',$0a
  189.         dc.b    'Informationen!',$0a
  190.         dc.b    '                           - Holgi -',0
  191.         even
  192.  
  193. ;;-- Undobuffer zurückschreiben --
  194. ;    ACHTUNG: nur von _Main über bcc anspringen!
  195.  
  196. _Undo        push    d0/d1/a0-a2/lb
  197.         bsr.w    _WaitPtr        WaitPointer setzen
  198.         exec
  199.         moveq.l    #0,d0
  200.         move.b    gl_UndoFloppy(gl),d0
  201.         mulu.w    #flo_SIZEOF,d0
  202.         lea.l    gl_Floppy0(gl,d0.w),a2            IORequest
  203.         move.w    #TD_CHANGENUM,flo_IO+IO_COMMAND(a2)
  204.         movea.l    a2,a1
  205.         fjsr    DoIO            Diskwechsel-Zahl holen
  206.         tst.b    d0
  207.         bne.b    .Error            ..Fehler
  208.         move.l    flo_IO+IO_ACTUAL(a2),d0
  209.         cmp.l    gl_UndoChange(gl),d0    Buffer gültig?
  210.         bne.b    .Ungultig        ..nein
  211.         movea.l    gl_ChipMem(gl),a1
  212.         lea.l    chip_UndoBuf(a1),a1
  213.         movea.l    a2,a0
  214.         bsr.w    _WriteBoot        UndoBuffer auf Disk schreiben
  215.         bne.b    .Error            ..Fehler
  216. .Exit        bsr.w    _ClearPtr        Normalpointer setzen
  217.         pull    d0/d1/a0-a2/lb
  218.         bra.w    _MainLoop
  219.  
  220. .Ungultig    lea.l    gl_SIZE+gfx_UndoItem(gl),a0
  221.         bclr.b    #ITEMENABLEDb,mi_Flags+1(a0)    Undo-Item disablen
  222.         lea.l    .UngText(pc),a1            Fehlertext
  223.         bra.b    .UndoError
  224.  
  225. .Error        suba.l    a1,a1                kein Fehlertext
  226. .UndoError    lea.l    .UndoText(pc),a0        Fehleraktion
  227.         move.b    gl_UndoFloppy(gl),d1        Unit
  228.         bsr.w    _IOError            Requester darstellen
  229.         bra.b    .Exit
  230.  
  231. .UndoText    dc.b    'Zurückschreiben',0
  232. .UngText    dc.b    'Undobuffer ist ungültig',0    ACHTUNG: 0Byte vorne!
  233.         even
  234.  
  235. ;;-- Bootblock installieren --
  236. ;    ACHTUNG: nur von _Main über bcc anspringen!
  237. ;    In:    d0.b = UnitNummer
  238.  
  239. _Install    push    d0-d2/a0-a2/lb
  240.         bsr.w    _WaitPtr        Waitpointer setzen
  241.         move.b    d0,gl_UndoFloppy(gl)    Unit für Undobuffer merken
  242.         exec
  243.         ext.w    d0
  244.         mulu.w    #flo_SIZEOF,d0
  245.         lea.l    gl_Floppy0(gl,d0.w),a2    IORequest
  246.         movea.l    a2,a0
  247.         bsr.w    _ReadBoot        alten BB lesen
  248.         bne.b    .Error                    ..Fehler
  249.         move.w    #TD_CHANGENUM,flo_IO+IO_COMMAND(a2)
  250.         movea.l    a2,a1
  251.         fjsr    DoIO            Diskwechsel-Zahl holen
  252.         tst.b    d0
  253.         bne.b    .Error                    ..Fehler
  254.         move.l    flo_IO+IO_ACTUAL(a2),gl_UndoChange(gl)    Zahl sichern
  255.         lea.l    gl_SIZE+gfx_UndoItem(gl),a0
  256.         bset.b    #ITEMENABLEDb,mi_Flags+1(a0)    Undo-Item enablen
  257.  
  258.         movea.l    gl_ChipMem(gl),a0
  259.         lea.l    chip_UndoBuf(a0),a1
  260.         lea.l    chip_ReadBuf(a0),a0
  261.         move.w    #BB_SIZEOF/4-1,d0
  262. .UndoLoop    move.l    (a0)+,(a1)+        alten BB in UndoBuffer kop.
  263.         dbf    d0,.UndoLoop
  264.  
  265.         lea.l    -BB_SIZEOF(a0),a0
  266.         lea.l    _WriteBuf(pc),a1
  267.         move.w    #(BB_SIZEOF-BB_SIZE)/4,d0
  268.         move.l    (a0)+,d1            BB_ID
  269.         addq.l    #4,a0
  270.         add.l    (a0)+,d1        ..+BB_DOSBLOCK
  271.         bra.b    .WriteCont
  272. .WriteLoop    move.l    (a1),(a0)+        Bootcode über alten BB kop.
  273.         add.l    (a1)+,d1        Checksumme
  274. .WriteCont    bcc.b    .WriteEnd
  275.         addq.l    #1,d1            ..berechnen
  276. .WriteEnd    dbf    d0,.WriteLoop
  277.         not.l    d1
  278.  
  279.         lea.l    -BB_SIZEOF(a0),a1
  280.         move.l    d1,BB_CHKSUM(a1)    ..und eintragen
  281.         movea.l    a2,a0
  282.         bsr.w    _WriteBoot        BB installieren
  283.         bne.b    .Error            ..Fehler
  284. .Exit        bsr.w    _ClearPtr        alten Pointer setzen
  285.         pull    d0-d2/a0-a2/lb
  286.         bra.w    _MainLoop
  287.  
  288. .Error        suba.l    a1,a1            kein Fehlertext
  289.         move.b    3(sp),d1            UnitNummer
  290. .InstallError    lea.l    gl_SIZE+gfx_UndoItem(gl),a0
  291.         bclr.b    #ITEMENABLEDb,mi_Flags+1(a0)    Undo-Item disablen
  292.         lea.l    .InstallText(pc),a0        Fehleraktion
  293.         bsr.b    _IOError        Requester darstellen
  294.         bra.b    .Exit
  295.  
  296. .InstallText    dc.b    'Installieren',0
  297.         even
  298.  
  299. ;;-- Requester bei DoIO-Fehler darstellen --
  300. ;    In:    a0 = *FehlerStelle, a1 = *FehlerText (oder 0, dann d0.b= TDERR)
  301. ;        d1.b = Unit
  302. ;    ACHTUNG: a0_SIZEOF+a1_SIZEOF darf max. 100 sein!
  303.  
  304. _IOError    push    d0/d1/a0-a3
  305.         lea.l    -128(sp),sp
  306.         movea.l    sp,a2
  307.         lea.l    .BodyText(pc),a3
  308. .BodyLoop    move.b    (a3)+,(a2)+        'Unit x: Fehler...' kopieren
  309.         bne.b    .BodyLoop
  310.         add.b    d1,5(sp)        UnitNummer korrigieren
  311.         subq.l    #1,a2
  312. .StelleLoop    move.b    (a0)+,(a2)+        Fehleraktion kopieren
  313.         bne.b    .StelleLoop
  314.         move.b    #',',-1(a2)
  315.         move.b    #$0a,(a2)+
  316.         move.l    a1,d1            Fehlertext angegeben?
  317.         beq.b    .CalcFehler        ..nein
  318. .FehlerLoop    move.b    (a1)+,(a2)+        ..ja, kopieren
  319.         bne.b    .FehlerLoop
  320.         move.b    #'!',-1(a2)
  321.         clr.b    (a2)
  322.         movea.l    sp,a0
  323.         suba.l    a1,a1
  324.         bsr.w    _Request        Requester darstellen
  325.         lea.l    128(sp),sp
  326.         pull    d0/d1/a0-a3
  327.         rts
  328.  
  329. .CalcFehler    moveq.l    #0,d1
  330.         subi.b    #20,d0
  331.         blt.b    .Calc2            ..kein bekannter TDERR
  332.         cmpi.b    #35-20,d0
  333.         bgt.b    .Calc2            .."    "
  334.         moveq.l    #0,d1
  335.         move.b    d0,d1
  336.         lsl.b    #2,d1            Offset berechnen
  337. .Calc2        lea.l    gl_SIZE(gl),a0
  338.         move.l    a0,d0
  339.         lea.l    gl_SIZE+gfx_TDERR20(gl),a0
  340.         add.l    d1,a0                Pointer berechnen
  341.         bsr.w    _Addr            ..und korrigieren
  342.         movea.l    a0,a1
  343.         bra.b    .FehlerLoop
  344.  
  345. .BodyText    dc.b    'Unit 0: Fehler beim ',0
  346.         even
  347.  
  348. ;;-- Bootblock einlesen --
  349. ;    In:    a0 = *IORequest
  350. ;    Out:    d0.b = IOError, cc=d0.b
  351.  
  352. _ReadBoot    push    d1/a0-a2/lb
  353.         exec
  354.         movea.l    a0,a2
  355.         movea.l    gl_ChipMem(gl),a0
  356.         lea.l    chip_ReadBuf(a0),a0
  357.         move.l    a0,IO_DATA(a2)            Bufferadresse
  358.         move.l    #BB_SIZEOF,IO_LENGTH(a2)    Größe
  359.         clr.l    IO_OFFSET(a2)            Blockstart
  360.         move.w    #CMD_READ,IO_COMMAND(a2)
  361.         movea.l    a2,a1
  362.         fjsr    DoIO            BB einlesen
  363.         movea.l    a2,a0
  364.         bsr.b    _MotorOff        Motor ausschalten
  365.         tst.b    d0            cc setzen
  366.         pull    d1/a0-a2/lb
  367.         rts
  368.  
  369. ;;-- Bootblock schreiben --
  370. ;    In:    a0 = *IORequest, a1 = *BootBlock
  371. ;    Out:    d0.b = IOError, cc=d0.b
  372.  
  373. _WriteBoot    push    d1/a0-a2/lb
  374.         exec
  375.         movea.l    a0,a2
  376.         move.l    a1,IO_DATA(a2)            Buffer
  377.         move.l    #BB_SIZEOF,IO_LENGTH(a2)    Größe
  378.         clr.l    IO_OFFSET(a2)            Blockstart
  379.         move.w    #CMD_WRITE,IO_COMMAND(a2)
  380.         movea.l    a2,a1
  381.         fjsr    DoIO            BB schreiben
  382.         tst.b    d0
  383.         bne.b    .Exit                ..Fehler
  384.         move.w    #CMD_UPDATE,IO_COMMAND(a2)
  385.         movea.l    a2,a1
  386.         fjsr    DoIO            TrackBuffer flushen
  387. .Exit        movea.l    a2,a0
  388.         bsr.b    _MotorOff        Motor aus
  389.         tst.b    d0            cc setzen
  390.         pull    d1/a0-a2/lb
  391.         rts
  392.  
  393. ;;-- Motor ausschalten
  394. ;    In:    a0 = *IORequest
  395.  
  396. _MotorOff    push    d0/d1/a0/a1/lb
  397.         exec
  398.         movea.l    a0,a1
  399.         clr.l    IO_LENGTH(a1)            = Motor aus
  400.         move.w    #TD_MOTOR,IO_COMMAND(a1)
  401.         fjsr    DoIO
  402.         pull    d0/d1/a0/a1/lb
  403.         rts
  404.  
  405. ;;-- ChipMem besorgen --
  406. ;    Out:    cc=eq, wenn Fehler
  407.  
  408. _AllocChip    push    d0/d1/a0/a1/lb
  409.         exec
  410.         move.l    #chip_SIZEOF,d0
  411.         moveq.l    #MEMF_CHIP!MEMF_PUBLIC,d1
  412.         fjsr    AllocMem            Speicher holen
  413.         move.l    d0,gl_ChipMem(gl)    ..und sichern
  414.         beq.b    .Exit            ..Fehler
  415.         movea.l    d0,a0
  416.         lea.l    _ChipStart(pc),a1
  417.         move.w    #chip_SIZE/2-1,d0
  418. .Loop        move.w    (a1)+,(a0)+        existierende Daten umkop.
  419.         dbf    d0,.Loop
  420.         moveq.l    #-1,d0            cc setzen
  421. .Exit        pull    d0/d1/a0/a1/lb
  422.         rts
  423.  
  424. ;;-- ChipMem freigeben --
  425.  
  426. _FreeChip    push    d0/d1/a0/a1/lb
  427.         exec
  428.         move.l    gl_ChipMem(gl),d0    Speicher allokiert?
  429.         beq.b    .Exit            ..nein
  430.         movea.l    d0,a1
  431.         move.l    #chip_SIZEOF,d0
  432.         fjsr    FreeMem            ..ja, freigeben
  433. .Exit        pull    d0/d1/a0/a1/lb
  434.         rts
  435.  
  436. ;;-- Libraries öffnen --
  437. ;    Out:    cc=eq, wenn Fehler
  438.  
  439. _OpenLibs    push    d0/d1/a0/a1/lb
  440.         exec
  441.         lea.l    .IntuiName(pc),a1
  442.         moveq.l    #33,d0            (Kickstart 1.2)
  443.         fjsr    OpenLibrary        Intui.lib öffnen
  444.         move.l    d0,gl_IntuiBase(gl)    ..und Basis sichern
  445.         beq.b    .Error            ..Fehler
  446.         lea.l    .GfxName(pc),a1
  447.         moveq.l    #33,d0
  448.         fjsr    OpenLibrary        Gfx.lib öffnen
  449.         move.l    d0,gl_GfxBase(gl)    ..und Basis sichern
  450.         beq.b    .Error            ..Fehler
  451. .Exit        pull    d0/d1/a0/a1/lb
  452.         rts
  453.  
  454. .Error        moveq.l    #ERROR_INVALID_RESIDENT_LIBRARY,d0
  455.         move.l    d0,gl_Result2(gl)            Result2 setzen
  456.         clr.b    d0            cc setzen
  457.         bra.b    .Exit
  458.  
  459. .IntuiName    INTUINAME
  460. .GfxName    GRAPHICSNAME
  461.         even
  462.  
  463. ;;-- Libraries schließen --
  464.  
  465. _CloseLibs    push    d0/d1/a0/a1/lb
  466.         exec
  467.         slib    Gfx,d0            Gfx.lib geöffnet?
  468.         beq.b    .CloseIntui        ..nein
  469.         movea.l    d0,a1
  470.         fjsr    CloseLibrary        ..ja, schließen
  471. .CloseIntui    slib    Intui,d0        Intui.lib geöffnet?
  472.         beq.b    .Exit            ..nein
  473.         movea.l    d0,a1
  474.         fjsr    CloseLibrary        ..ja, schließen
  475. .Exit        pull    d0/d1/a0/a1/lb
  476.         rts
  477.  
  478. ;;-- Trackdisk-Device für alle 4 Floppys öffnen --
  479. ;    Out:    cc=eq, wenn Fehler
  480.  
  481. _OpenTrackDisx    push    d0/d1/a0
  482.         moveq.l    #%1111,d1        Maske (Bit gesetzt->Drive an)
  483.         moveq.l    #4-1,d0            max. Units
  484.         lea.l    gl_Floppy3(gl),a0
  485. .Loop        bsr.b    _OpenFloppy        IORequest besorgen/Device öff.
  486.         beq.b    .SignalError        ..AllocSignal()-Fehler
  487.         bgt.b    .LoopCont        ..ok
  488.         bclr.l    d0,d1            ..Fehler, entsprechendes Bit=0
  489. .LoopCont    lea.l    -flo_SIZEOF(a0),a0
  490.         dbf    d0,.Loop
  491.  
  492.         move.b    d1,gl_Floppies(gl)    Maske sichern
  493.         beq.b    .DiskError        ..kein Drive aktiv!
  494. .Exit        pull    d0/d1/a0
  495.         rts
  496.  
  497. .DiskError    move.l    #ERROR_NO_DISK,gl_Result2(gl)    <- der paßt doch :-)
  498. .SignalError    clr.b    d0                cc setzen
  499.         bra.b    .Exit
  500.  
  501. ;;-- Trackdisk-Device öffnen --
  502. ;    In:    d0.l = Unit, a0.l = *Floppy-Struktur
  503. ;    Out:    cc=eq, wenn kein Signal frei war
  504. ;        cc=lt, wenn OpenDevice() fehlschlug
  505.  
  506. _OpenFloppy    push    d0-d2/a0-a2/lb
  507.         exec
  508.         movea.l    a0,a2
  509.         move.l    d0,d2
  510.         moveq.l    #-1,d0
  511.         fjsr    AllocSignal            SignalBit besorgen
  512.         move.b    d0,flo_Port+MP_SIGBIT(a2)    ..und sichern
  513.         blt.b    .SignalError                ..Fehler
  514.         move.b    #NT_MSGPORT,flo_Port+LN_TYPE(a2)    weitere
  515.         move.b    #PA_SIGNAL,flo_Port+MP_FLAGS(a2)    ..Korrekturen
  516.         move.l    gl_Process(gl),flo_Port+MP_SIGTASK(a2)
  517.  
  518.         lea.l    flo_Port+MP_MSGLIST(a2),a0    MsgListe
  519.         lea.l    LH_TAILPRED(a0),a1
  520.         move.l    a0,(a1)
  521.         subq.l    #4,a1
  522.         move.l    a1,(a0)                ..initialisieren
  523.  
  524.         move.b    #NT_MESSAGE,flo_IO+LN_TYPE(a2)
  525.         move.w    #IOTD_SIZE,flo_IO+MN_LENGTH(a2)
  526.         lea.l    flo_Port(a2),a0
  527.         move.l    a0,flo_IO+MN_REPLYPORT(a2)
  528.         lea.l    .TrackDiskName(pc),a0
  529.         move.l    d2,d0                Unit
  530.         movea.l    a2,a1
  531.         moveq.l    #0,d1            keine Flags
  532.         fjsr    OpenDevice        Device öffnen
  533.         tst.b    d0            Fehler?
  534.         bne.b    .OpenError        ..ja
  535.         moveq.l    #1,d0            ..nein, cc setzen
  536. .FloppyExit    pull    d0-d2/a0-a2/lb
  537.         rts
  538.  
  539. .SignalError    clr.b    d0            cc setzen
  540.         bra.b    .FloppyExit
  541.  
  542. .OpenError    moveq.l    #-1,d0            cc setzen
  543.         bra.b    .FloppyExit
  544.  
  545. .TrackDiskName    dc.b    'trackdisk.device',0
  546.         even
  547.  
  548. ;;-- Trackdisk-Device schließen (alle 4 Floppys) --
  549.  
  550. _CloseTrackDisx    push    d0-d2/a0-a2/lb
  551.         exec
  552.         moveq.l    #4-1,d2            max. Units
  553.         lea.l    gl_Floppy3(gl),a2    Maske der aktiven Drives
  554. .Loop        btst.b    d2,gl_Floppies(gl)    IORequest existent?
  555.         beq.b    .LoopCont        ..nein
  556.         movea.l    a2,a1
  557.         fjsr    CloseDevice        ..ja, beenden
  558. .LoopCont    moveq.l    #0,d0
  559.         move.b    flo_Port+MP_SIGBIT(a2),d0    Signal belegt?
  560.         ble.b    .LoopCont2            ..nein
  561.         fjsr    FreeSignal        ..ja, freigeben
  562. .LoopCont2    lea.l    -flo_SIZEOF(a2),a2
  563.         dbf    d2,.Loop
  564.  
  565.         pull    d0-d2/a0-a2/lb
  566.         rts
  567.  
  568. ;;-- Window öffnen etc. --
  569. ;    Out:    cc=eq, wenn Fehler
  570.  
  571. _OpenDisplay    push    d0/d1/a0-a2/lb
  572.         slib    Intui
  573.         exec    a0
  574.         cmpi.w    #36,LIB_VERSION(a0)
  575.         blt.b    .NoOS2.0        ..kleiner als OS2.0
  576.  
  577. .OS2.0        suba.l    a0,a0
  578.         fjsr    LockPubScreen        default PubScreen holen
  579.         tst.l    d0
  580.         beq.b    .Exit            ..Fehler
  581.         movea.l    d0,a2
  582.         move.l    sc_Width(a2),gl_ScrWidth(gl)    Screenbreite,
  583.         movea.l    sc_Font(a2),a0
  584.         move.l    a0,gl_BarFont(gl)        ..Font und
  585.         move.w    ta_YSize(a0),gl_BarHeight(gl)    ..FontHöhe sichern
  586.         movea.l    a2,a0
  587.         fjsr    GetScreenDrawInfo
  588.         movea.l    d0,a1
  589.         move.l    dri_Pens(a1),a0
  590.         move.b    TEXTPEN*2+1(a0),gl_TextPen(gl)        Farbregister
  591.         move.b    SHINEPEN*2+1(a0),gl_ShinePen(gl)    ..sichern
  592.         move.b    SHADOWPEN*2+1(a0),gl_ShadowPen(gl)
  593.         move.b    HIGHLIGHTTEXTPEN*2+1(a0),gl_HiTextPen(gl)
  594.         move.b    BACKGROUNDPEN*2+1(a0),gl_BackPen(gl)
  595.         fjsr    FreeScreenDrawInfo
  596.         moveq.l    #PUBLICSCREEN,d0    ScreenType
  597.         bsr.b    _Layout            Window öffnen etc.
  598.         movea.l    a2,a1
  599.         suba.l    a0,a0
  600.         beq.b    .OS2.0Error        ..Fehler
  601.         fjsr    UnlockPubScreen        PubScreen freigeben
  602.         moveq.l    #-1,d0            cc setzen
  603. .Exit        pull    d0/d1/a0-a2/lb
  604.         rts
  605.  
  606. .OS2.0Error    fjsr    UnlockPubScreen        PubScreen freigeben
  607.         clr.b    d0            cc setzen
  608.         bra.b    .Exit
  609.  
  610. ;    ACHTUNG: Nach dem OpenWB() darf kein anderer Task den Screen schließen!
  611.  
  612. .NoOS2.0    fjsr    OpenWorkBench        WB-Screen öffnen
  613.         tst.l    d0
  614.         beq.b    .Exit            ..Fehler
  615.         movea.l    d0,a0                evtl. ungültig :-(
  616.         move.l    sc_Width(a0),gl_ScrWidth(gl)    Screenbreite etc.
  617.         movea.l    sc_Font(a0),a0            ..sichern
  618.         move.l    a0,gl_BarFont(gl)
  619.         move.w    ta_YSize(a0),gl_BarHeight(gl)
  620.         move.b    #1,gl_TextPen(gl)
  621.         move.b    #1,gl_ShadowPen(gl)
  622.         move.b    #2,gl_ShinePen(gl)
  623.         move.b    #2,gl_HiTextPen(gl)
  624.         *clr.b    gl_BackPen(gl)        (ist schon NULL)
  625.         moveq.l    #WBENCHSCREEN,d0    ScreenType
  626.         bsr.b    _Layout            Window öffnen etc.
  627.         bra.b    .Exit
  628.  
  629. ;;-- Window schließen etc. --
  630.  
  631. _CloseDisplay    push    d0-d2/a0/a1/lb
  632.         move.l    gl_Window(gl),d2    Window geöffnet?
  633.         beq.b    .Exit            ..nein
  634.         slib    Intui
  635.         movea.l    d2,a0
  636.         fjsr    ClearMenuStrip
  637.         movea.l    d2,a0
  638.         fjsr    CloseWindow        ..ja, schließen
  639. .Exit        pull    d0-d2/a0/a1/lb
  640.         rts
  641.  
  642. ;;-- alle Gadgets/Menüs/Texte layouten & Window öffnen--
  643. ;    korrigiert:    gg_NextGG, gg_TopEdge, gg_GGRender, gg_GGText
  644. ;            bd_NextBorder, bd_XY, bd_FrontPen
  645. ;            it_IText, it_NextText, it_FrontPen
  646. ;            ta_Name
  647. ;            nw_LeftEdge, nw_TopEdge, nw_Height, nw_Title, nw_Type
  648. ;            mu_Width, mu_Height, mu_MenuName, mu_FirstItem
  649. ;            mi_Left/TopEdge, mi_Width/Height, mi_ItemFill, mi_SubI.
  650. ;            u. v. m.
  651. ;    In:    d0 = Window/ScreenTyp (WB oder Public)
  652. ;    Out:    cc=eq, wenn Fehler
  653.  
  654. _Layout        push    d0-d2/a0/a1/lb
  655.         slib    Intui
  656.         lea.l    gl_SIZE(gl),a0        = NewWindow
  657.         move.w    d0,nw_Type(a0)        Typ eintragen
  658.         move.l    a0,d0
  659.         bsr.w    _NewWindow        NewWindow layouten
  660.         beq.b    .Exit                ..Fehler
  661.         lea.l    gl_SIZE+gfx_FirstStrip(gl),a0
  662.         bsr.w    _MenuStrip            MenuStrip layouten
  663.         lea.l    gl_SIZE+gfx_DF0Sub(gl),a0
  664.         lea.l    gl_SIZE+gfx_DF0GG(gl),a1
  665.         move.b    gl_Floppies(gl),d0        Drivemaske
  666. .Loop        btst.l    #0,d0            Drive aktiv?
  667.         beq.b    .Cont                ..nein
  668.         bclr.b    #GADGDISABLEDb,gg_Flags(a1)    ..ja, Gadget und
  669.         bset.b    #ITEMENABLEDb,mi_Flags+1(a0)    ..MenuItem enablen
  670. .Cont        movea.l    (a1),a1
  671.         movea.l    (a0),a0
  672.         lsr.b    #1,d0
  673.         bne.b    .Loop
  674.  
  675.         lea.l    gl_SIZE(gl),a0
  676.         fjsr    OpenWindow        Window öffnen
  677.         move.l    d0,gl_Window(gl)    ..und Adresse sichern
  678.         beq.b    .Exit            ..Fehler
  679.  
  680.         lea.l    gl_SIZE(gl),a0
  681.         move.l    a0,d0                Basis
  682.         lea.l    gl_SIZE+gfx_FirstIText(gl),a0
  683.         bsr.w    _IText                IText layouten
  684.         movea.l    a0,a1
  685.         movea.l    gl_Window(gl),a0
  686.         movea.l    wd_RPort(a0),a0
  687.         moveq.l    #0,d0
  688.         move.w    gl_BarHeight(gl),d1
  689.         fjsr    PrintIText            ..und ausgeben
  690.  
  691.         movea.l    gl_Window(gl),a0
  692.         lea.l    gl_SIZE+gfx_FirstStrip(gl),a1
  693.         fjsr    SetMenuStrip            MenuStrip setzen
  694.         tst.l    d0            cc setzen
  695.  
  696. .Exit        pull    d0-d2/a0/a1/lb
  697.         rts
  698.  
  699. ;;-- Requester darstellen --
  700. ;    In:    a0 = *BodyText, a1 = *Image oder NULL
  701. ;    BodyText: Text, $0a, Text, $0a, Text..., 0
  702. ;    Out:    cc=eq, wenn Fehler
  703. ;    ACHTUNG: gfx_TopazFont muß initialisiert sein!
  704.  
  705. _Request    push    d0-d4/a0-a4/lb
  706.         bsr.w    _WaitPtr
  707.         moveq.l    #0,d2            Zeilenzahl
  708.         moveq.l    #0,d1            max. Spalten
  709.         movea.l    a0,a2
  710.         movea.l    a1,d3
  711. .CalcLoop    moveq.l    #0,d0            aktuelle Spalten
  712.         addq.w    #1,d2            Zeilenzahl++
  713. .CalcLoop2    tst.b    (a0)
  714.         beq.b    .CalcExit        ..Textende
  715.         cmpi.b    #$0a,(a0)+
  716.         beq.b    .CalcLoop        ..Zeilenende
  717.         addq.w    #1,d0            Spalten++
  718.         cmp.w    d0,d1
  719.         bgt.b    .CalcLoop2
  720.         move.w    d0,d1            evtl. = max. Spalten
  721.         bra.b    .CalcLoop2
  722. .CalcExit    lsl.w    #3,d1            ..* 8 = Pixels
  723.         mulu.w    #9,d2            Zeilen * 9 = Pixels
  724.         addi.w    #36,d1            Werte korrigieren
  725.         addi.w    #34-1,d2
  726.  
  727.         lea.l    gl_SIZE(gl),a0
  728.         move.l    a0,d0                Basis
  729.         lea.l    gl_SIZE+gfx_ReqNewWin(gl),a0
  730.         bsr.w    _ReqWindow            ReqNewWindow layouten
  731.         beq.w    .Error            ..Fehler
  732.         slib    Intui
  733.         fjsr    OpenWindow        Window öffnen
  734.         tst.l    d0
  735.         beq.w    .Error            ..Fehler
  736.         movea.l    d0,a3
  737.         movea.l    wd_RPort(a3),a4
  738.  
  739. .DrawinStuff    slib    Gfx
  740.         movea.l    a4,a1
  741.         moveq.l    #RP_JAM1,d0
  742.         fjsr    SetDrMd            DrawMode setzen
  743.         lea.l    .Pattern(pc),a0
  744.         move.l    a0,rp_AreaPtrn(a4)    Füllmuster
  745.         move.b    #1,rp_AreaPtSz(a4)    Musterhöhe-1
  746.         movea.l    a4,a1
  747.         moveq.l    #0,d0
  748.         move.b    gl_ShinePen(gl),d0
  749.         fjsr    SetAPen            Farbe = hell
  750.         movea.l    a4,a1
  751.         moveq.l    #4,d0
  752.         moveq.l    #3,d1
  753.         add.w    gl_BarHeight(gl),d1
  754.         movem.w    wd_Width(a3),d2/d3
  755.         subq.l    #4,d2
  756.         subq.l    #2,d3
  757.         fjsr    RectFill        weiß/grau füllen
  758.         clr.l    rp_AreaPtrn(a4)        normale Musterwerte
  759.         clr.b    rp_AreaPtSz(a4)
  760.         movea.l    a4,a1
  761.         moveq.l    #0,d0
  762.         fjsr    SetAPen                Löschfarbe
  763.         lea.l    gl_SIZE+gfx_ReqXY1(gl),a0
  764.         lea.l    gl_SIZE+gfx_ReqXY2(gl),a1
  765.         moveq.l    #4+5,d0
  766.         moveq.l    #3+2,d1
  767.         add.w    gl_BarHeight(gl),d1
  768.         subq.w    #6,d2
  769.         subi.w    #2+14+2,d3
  770.         move.w    d2,(a0)            Werte für inneren Border
  771.         subq.w    #1,(a0)+        ..eintragen
  772.         move.w    d1,(a0)+
  773.         move.w    d0,(a0)+
  774.         move.w    d1,(a0)+
  775.         move.w    d0,(a0)+
  776.         move.w    d3,(a0)
  777.         subq.w    #1,(a0)+
  778.         move.w    d0,(a1)
  779.         addq.w    #1,(a1)+
  780.         move.w    d3,(a1)+
  781.         move.w    d2,(a1)+
  782.         move.w    d3,(a1)+
  783.         move.w    d2,(a1)+
  784.         move.w    d1,(a1)
  785.         addq.w    #1,(a1)
  786.         movea.l    a4,a1
  787.         fjsr    RectFill        Textfeld löschen
  788.         movea.l    a4,a1
  789.         movem.w    wd_Width(a3),d0/d1
  790.         lsr.w    #1,d0
  791.         move.w    d0,d2
  792.         move.w    d1,d3
  793.         subi.w    #38/2,d0
  794.         addi.w    #38/2-1,d2
  795.         subi.w    #2+14+2,d1
  796.         subq.w    #2+3,d3
  797.         move.w    d0,gl_SIZE+gfx_ReqGG+gg_LeftEdge(gl)
  798.         fjsr    RectFill                GGFeld löschen
  799.  
  800.         slib    Intui
  801.         lea.l    gl_SIZE+gfx_ReqIText(gl),a0
  802.         lea.l    gl_SIZE+gfx_TopazFont(gl),a1    Topaz8 für Text
  803.         move.l    a1,it_ITextFont(a0)        ..benutzen
  804.         move.b    gl_TextPen(gl),it_FrontPen(a0)    normale Textfarbe
  805.         move.w    gl_BarHeight(gl),it_TopEdge(a0)
  806. .TextLoop2    move.l    a2,it_IText(a0)            aktuelle Zeile
  807. .TextLoop    move.b    (a2),d0
  808.         beq.b    .TextEnd        ..Textende
  809.         cmpi.b    #$0a,d0
  810.         beq.b    .TextEnd        ..Zeilenende
  811.         addq.l    #1,a2
  812.         bra.b    .TextLoop
  813. .TextEnd    movea.l    a0,a1
  814.         move.l    a0,-(sp)        IText sichern
  815.         movea.l    a4,a0
  816.         moveq.l    #4+6+8,d0
  817.         moveq.l    #3+3+4,d1
  818.         move.b    (a2),d2            altes Zeichen am Zeilenende
  819.         clr.b    (a2)            ..durch NULLByte ersetzen
  820.         fjsr    PrintIText        Text ausgeben
  821.         move.l    (sp)+,a0        IText wieder restoren
  822.         addi.w    #9,it_TopEdge(a0)    Y-Position erhöhen
  823.         move.b    d2,(a2)+        altes Zeilenende zurück
  824.         bne.b    .TextLoop2
  825.  
  826.         lea.l    gl_SIZE(gl),a0
  827.         move.l    a0,d0                Basis
  828.         lea.l    gl_SIZE+gfx_ReqGG(gl),a0
  829.         bsr.w    _Gadget                Gadget layouten,
  830.         movea.l    a0,a1
  831.         movea.l    a3,a0
  832.         moveq.l    #-1,d0
  833.         move.l    a1,d4
  834.         fjsr    AddGadget        ..ins Window hängen
  835.         move.l    d4,a0
  836.         movea.l    a3,a1
  837.         suba.l    a2,a2
  838.         fjsr    RefreshGadgets        ..und refreshen
  839.         lea.l    gl_SIZE(gl),a0
  840.         move.l    a0,d0                Basis
  841.         lea.l    gl_SIZE+gfx_ReqBorder(gl),a0
  842.         bsr.w    _Border                Border layouten
  843.         movea.l    a0,a1
  844.         movea.l    a4,a0
  845.         moveq.l    #0,d0
  846.         moveq.l    #0,d1
  847.         fjsr    DrawBorder        ..und zeichnen
  848.  
  849.         move.l    6*4(sp),d0        Image angegeben?
  850.         beq.b    .NoImage        ..nein
  851.         movea.l    d0,a1
  852.         lea.l    ig_ImageData(a1),a0    ..ja, evtl. Pointer auf
  853.         bsr.w    _Addr            ..Graphik korrigieren
  854.         movea.l    a4,a0
  855.         moveq.l    #0,d0
  856.         move.w    gl_BarHeight(gl),d1
  857.         fjsr    DrawImage        Image blitten
  858. .NoImage
  859.         movea.l    a3,a0
  860.         bsr.w    _GetMsg            auf Userreaktion warten
  861.  
  862.         movea.l    a3,a0
  863.         bsr.w    _ClearPtr        alter Pointer
  864.         fjsr    CloseWindow        ReqWindow schließen
  865.         moveq.l    #1,d0            cc setzen
  866. .Exit        pull    d0-d4/a0-a4/lb
  867.         rts
  868.  
  869. .Error        slib    Intui            Requester konnte nicht
  870.         movea.l    gl_Window(gl),a0    ..dargestellt werden,
  871.         movea.l    wd_WScreen(a0),a0
  872.         fjsr    DisplayBeep        ..also beepen wir
  873.         bsr.w    _ClearPtr        alter Pointer
  874.         clr.b    d0            cc setzen
  875.         bra.b    .Exit
  876.  
  877. .Pattern    dc.w    %1010101010101010
  878.         dc.w    %0101010101010101
  879.  
  880. ;;-- Gadgets layouten --
  881. ;    In:    a0 = *FirstGG, d0 = *Basis
  882. ;    Gadget muß haben: gg_GGRender(Border!), gg_GGText
  883.  
  884. _Gadget        push    d1/a0/a1
  885.         movea.l    a0,a1
  886. .Loop        lea.l    gg_GadgetRender(a1),a0
  887.         bsr.w    _Addr            Borderadresse korrigieren
  888.         bge.b    .Next            ..GG schon gelayoutet
  889.         bsr.b    _Border            Border layouten
  890.         lea.l    gg_GadgetText(a1),a0
  891.         bsr.w    _Addr            Textadresse korrigieren
  892.         bsr.b    _IText                ..und Text layouten
  893.         btst.b    #GRELBOTTOMb,gg_Flags+1(a1)
  894.         bne.b    .Next                ..keine absolute YPos
  895.         move.w    gl_BarHeight(gl),d1    YPos
  896.         add.w    d1,gg_TopEdge(a1)    ..korrigieren
  897. .Next        movea.l    a1,a0
  898.         bsr.b    _Addr            gg_NextGadget korrigieren
  899.         movea.l    a0,a1
  900.         move.l    a0,d1
  901.         bne.b    .Loop            ..weiteres GG
  902.         pull    d1/a0/a1
  903.         rts
  904.  
  905. ;;-- Border layouten --
  906. ;    In:    a0 = *FirstBorder, d0 = *Basis
  907. ;    Border muß haben: bd_FrontPen = gl_xPen, bd_XY
  908.  
  909. _Border        push    d1/a0/a1
  910.         movea.l    a0,a1
  911. .Loop        lea.l    bd_XY(a1),a0
  912.         bsr.b    _Addr            Adresse der Koordinaten korr.
  913.         bge.b    .Next            ..Border schon gelayoutet
  914.         moveq.l    #0,d1
  915.         move.b    bd_FrontPen(a1),d1
  916.         move.b    (gl,d1.w),bd_FrontPen(a1)    Farbe korrigieren
  917. .Next        lea.l    bd_NextBorder(a1),a0
  918.         bsr.b    _Addr            bd_NextBorder korrigieren
  919.         movea.l    a0,a1
  920.         move.l    a0,d1
  921.         bne.b    .Loop            ..weiterer Border
  922.         pull    d1/a0/a1
  923.         rts
  924.  
  925. ;;-- ITexte layouten --
  926. ;    In:    a0 = *IText, d0 = *Basis
  927. ;    IText muß haben: it_FrontPen = gl_xPen, it_IText
  928.  
  929. _IText        push    d1/a0/a1
  930.         movea.l    a0,a1
  931. .Loop        lea.l    it_IText(a1),a0
  932.         bsr.b    _Addr            Textadresse korrigieren
  933.         bge.b    .Next            ..IText schon gelayoutet
  934.         lea.l    it_ITextFont(a1),a0
  935.         bsr.b    _Addr            TextAttr-Adresse korrigieren
  936.         blt.b    .Cont                ..Font angegeben
  937.         move.l    gl_BarFont(gl),it_ITextFont(a1)    ..kein Font->DefaultFo.
  938.         bra.b    .Cont2
  939. .Cont        bsr.b    _Addr            ta_Name korrigieren
  940. .Cont2        moveq.l    #0,d1
  941.         move.b    it_FrontPen(a1),d1
  942.         move.b    (gl,d1.w),it_FrontPen(a1)    Farbe korrigieren
  943. .Next        lea.l    it_NextText(a1),a0
  944.         bsr.b    _Addr            it_NextText korrigieren
  945.         movea.l    a0,a1
  946.         move.l    a0,d1
  947.         bne.b    .Loop            ..weiterer IText
  948.         pull    d1/a0/a1
  949.         rts
  950.  
  951. ;;-- Adresse korrigieren --
  952. ;    In:    a0 = *Adresse (~(RealAddr-Basis)), d0 = Basis
  953. ;    Out:    a0 = RealAddr, cc=ge, wenn Adresse schon korrigiert
  954.  
  955. _Addr        push    d0/d1
  956.         tst.l    (a0)            Adresse schon korrigiert?
  957.         bge.b    .Exit            ..ja
  958.         not.l    (a0)            ..nein
  959.         add.l    d0,(a0)
  960.         moveq.l    #-1,d0            cc setzen
  961. .Exit        movea.l    (a0),a0            neue Adresse
  962.         pull    d0/d1
  963.         rts
  964.  
  965. ;;-- NewWindow layouten --
  966. ;    In:    a0 = *NewWindow, d0 = *Basis
  967. ;    NewWindow muß haben: nw_FirstGadget
  968. ;    Out:    cc=eq, wenn Dimensionen zu groß
  969.  
  970. _NewWindow    push    d1/a0/a1
  971.         movea.l    a0,a1
  972.         move.w    gl_BarHeight(gl),d1
  973.         add.w    d1,nw_Height(a1)    Höhe korrigieren
  974.         move.w    gl_ScrHeight(gl),d1
  975.         sub.w    nw_Height(a1),d1
  976.         blt.b    .Error            ..Window zu hoch
  977.         lsr.w    #2,d1
  978.         move.w    d1,nw_TopEdge(a1)    1/4 Screenhöhe
  979.         move.w    gl_ScrWidth(gl),d1
  980.         sub.w    nw_Width(a1),d1
  981.         blt.b    .Error            ..Window zu breit
  982.         lsr.w    #1,d1
  983.         move.w    d1,nw_LeftEdge(a1)    1/2 Screenbreite
  984.         lea.l    nw_Title(a1),a0
  985.         bsr.b    _Addr            Titeladresse korrigieren
  986.         lea.l    nw_FirstGadget(a1),a0
  987.         bsr.b    _Addr            Gadgetadresse korrigieren
  988.         bsr.w    _Gadget            ..und GGs layouten
  989. .Ok        moveq.l    #-1,d1            cc setzen
  990. .Exit        pull    d1/a0/a1
  991.         rts
  992.  
  993. .Error        clr.b    d0            cc setzen
  994.         bra.b    .Exit
  995.  
  996. ;;-- MenuStrip layouten --
  997. ;    In:    a0 = *MenuStrip, d0 = *Basis
  998. ;    MenuStrip muß haben: mu_FirstItem, mu_MenuName
  999.  
  1000. _MenuStrip    push    d0/d1/a0-a2/lb
  1001.         movea.l    a0,a2
  1002.         move.w    gl_BarHeight(gl),mu_Height(a2)    Höhe korrigieren
  1003.         lea.l    mu_MenuName(a2),a0
  1004.         bsr.b    _Addr            Namensadresse korrigieren
  1005.  
  1006.         slib    Intui
  1007.         clr.l    -(sp)            it_NextText
  1008.         move.l    a0,-(sp)        it_IText (Menuname)
  1009.         move.l    gl_BarFont(gl),-(sp)    it_ITextFont (vom Screen)
  1010.         clr.l    -(sp)            unwichtig
  1011.         clr.l    -(sp)            " "
  1012.         movea.l    sp,a0
  1013.         fjsr    IntuiTextLength        Breite
  1014.         addq.w    #8,d0            ..berechnen
  1015.         move.w    d0,mu_Width(a2)
  1016.         movea.l    sp,a0
  1017.         move.w    #'»'<<8!0,-(sp)
  1018.         move.l    sp,it_IText(a0)
  1019.         fjsr    IntuiTextLength        Breite des '»' Zeichens
  1020.         move.w    d0,gl_SubWidth(gl)    ..sichern
  1021.         lea.l    it_SIZEOF+2(sp),sp
  1022.         move.l    (sp),d0            Basis
  1023.  
  1024.         lea.l    mu_FirstItem(a2),a0
  1025.         bsr.w    _Addr            MenuItem-Adresse korrigieren
  1026.         moveq.l    #0,d1            linke Ecke der Items
  1027.         bsr.b    _MenuItem        Items layouten
  1028.         pull    d0/d1/a0-a2/lb
  1029.         rts
  1030.  
  1031. ;;-- Menu/SubItems layouten --
  1032. ;    In:    a0 = *FirstItem, d0 = *Basis, d1.w = LeftEdge
  1033. ;    Item muß haben: mi_ItemFill, mi_ItemFill->it_NextText ('»')
  1034. ;    mi_Flags ~= ITEMTEXT, wenn Zwischenbar gewünscht
  1035.  
  1036. _MenuItem    push    d0-d4/a0-a2/lb
  1037.         slib    Intui
  1038.         movea.l    a0,a2
  1039.         move.w    d1,d2            linke Ecke
  1040.         moveq.l    #0,d3            Boxbreite
  1041.         moveq.l    #0,d4            aktuelle YPos
  1042. .Loop        lea.l    mi_ItemFill(a2),a0
  1043.         bsr.w    _Addr            IText/Image-Adresse korrigieren
  1044.         bge.b    .Next            ..Item schon gelayoutet
  1045.         add.w    d4,mi_TopEdge(a2)        YPos eintragen
  1046.         btst.b    #ITEMTEXTb,mi_Flags+1(a2)    Zwischenbar?
  1047.         bne.b    .Text                ..nein
  1048. .Image        addq.w    #5,d4            ..ja, YPos erhöhen
  1049.         bra.b    .Next
  1050.  
  1051. .Text        bsr.w    _IText            ITextadresse korrigieren
  1052.         fjsr    IntuiTextLength
  1053.         tst.l    mi_SubItem(a2)        Subitems?
  1054.         beq.b    .NoSub            ..nein
  1055.         add.w    gl_SubWidth(gl),d0    ..ja, Breite für '»' addieren
  1056.         addi.w    #10+3,d0
  1057. .NoSub        btst.b    #COMMSEQb,mi_Flags+1(a2)    Shortcut?
  1058.         beq.b    .NoCommSeq            ..nein
  1059.         addi.w    #36+3,d0
  1060.         move.w    d0,-(sp)            alten Wert sichern
  1061.         clr.l    -(sp)
  1062.         clr.l    -(sp)
  1063.         move.l    gl_BarFont(gl),-(sp)
  1064.         clr.l    -(sp)
  1065.         clr.l    -(sp)
  1066.         movea.l    sp,a0
  1067.         move.w    mi_Command(a2),-(sp)
  1068.         move.l    sp,it_IText(a0)
  1069.         fjsr    IntuiTextLength        zusätzliche Breite berechnen
  1070.         lea.l    it_SIZEOF+2(sp),sp
  1071.         add.w    (sp)+,d0        Gesamtbreite berechnen
  1072. .NoCommSeq    cmpi.w    d0,d3
  1073.         bgt.b    .Cont
  1074.         move.w    d0,d3            Breite als größte deklarieren
  1075. .Cont        move.w    d2,mi_LeftEdge(a2)    XPos
  1076.         move.w    gl_BarHeight(gl),d0
  1077.         add.w    d0,mi_Height(a2)    ..und YPos eintragen
  1078.         add.w    d0,d4            YPos erhöhen
  1079. .Next        movea.l    a2,a0
  1080.         move.l    (sp),d0            Basis
  1081.         bsr.w    _Addr            mi_NextItem korrigieren
  1082.         movea.l    a0,a2
  1083.         move.l    a0,d1
  1084.         bne.b    .Loop            ..weiteres Item
  1085.  
  1086.         addq.w    #2,d3            linker Rand
  1087.         movea.l    5*4(sp),a1        FirstItem
  1088. .Loop2        move.w    d3,mi_Width(a1)        Breite eintragen
  1089.         lea.l    mi_SubItem(a1),a0
  1090.         bsr.w    _Addr            evtl. Adresse für Sub korrig.
  1091.         bge.b    .CheckBar        ..kein Sub
  1092.         move.w    d3,d1            ..Sub, XPos in d1
  1093.         bsr.w    _MenuItem        Subs berechnen (rekursiv :-)
  1094.         movea.l    mi_ItemFill(a1),a0
  1095.         movea.l    it_NextText(a0),a0
  1096.         sub.w    gl_SubWidth(gl),d1
  1097.         subq.w    #3,d1
  1098.         move.w    d1,it_LeftEdge(a0)        XPos des '»' Zeichens
  1099. .CheckBar    btst.b    #ITEMTEXTb,mi_Flags+1(a1)    Zwischenbar?
  1100.         bne.b    .Next2                ..nein
  1101.         movea.l    mi_ItemFill(a1),a0    ..ja (Image)
  1102.         move.w    d3,d1
  1103.         subq.w    #4,d1
  1104.         move.w    d1,ig_Width(a0)        Breite eintragen
  1105. .Next2        movea.l    (a1),a1
  1106.         move.l    a1,d2
  1107.         bne.b    .Loop2            ..weiteres Item
  1108.         pull    d0-d4/a0-a2/lb
  1109.         rts
  1110.  
  1111. ;;-- ReqNewWindow layouten --
  1112. ;    In:    a0 = *ReqWindow, d0 = *Basis, d1.w = Width, d2.w = Height
  1113. ;    Out:    cc=eq, wenn Dimensionen zu groß
  1114. ;    mehrmals aufrufbar mit demselben ReqWindow!
  1115.  
  1116. _ReqWindow    push    d1-d6/a0/a1
  1117.         movea.l    a0,a1
  1118.         add.w    gl_BarHeight(gl),d2    Höhe korrigieren
  1119.         movem.w    d1/d2,nw_Width(a1)    Breite/Höhe eintragen
  1120.         movem.w    gl_ScrWidth(gl),d3/d4
  1121.         sub.w    d1,d3
  1122.         blt.b    .Error            ..Window zu breit
  1123.         sub.w    d2,d4
  1124.         blt.b    .Error            ..zu hoch
  1125.  
  1126. .Left        movea.l    gl_Window(gl),a0
  1127.         movea.l    wd_WScreen(a0),a0
  1128.         move.l    a0,nw_Screen(a1)    Screenadresse eintragen (PubSc)
  1129.         movem.w    sc_MouseY(a0),d5/d6    d5=MouseY, d6=MouseX
  1130.         lsr.w    #1,d1
  1131.         sub.w    d1,d6
  1132.         bgt.b    .LeftCont
  1133.         moveq.l    #0,d6            XPos = 0, da MouseX zu klein
  1134.         bra.b    .Top
  1135. .LeftCont    cmp.w    d3,d6
  1136.         blt.b    .Top            XPos = MouseX
  1137.         move.w    d3,d6            XPos = rechter Rand,
  1138.                            ;..da MouseX zu groß
  1139. .Top        subi.w    #2+2+7,d2
  1140.         sub.w    d2,d5
  1141.         bgt.b    .TopCont
  1142.         moveq.l    #0,d5            YPos = 0, da MouseY zu klein
  1143.         bra.b    .Cont
  1144. .TopCont    cmp.w    d4,d5
  1145.         blt.b    .Cont            YPos = MouseY
  1146.         move.w    d4,d5            YPos = unterer Rand,
  1147.                            ;..da MouseY zu groß
  1148. .Cont        move.w    d6,nw_LeftEdge(a1)    Werte eintragen
  1149.         move.w    d5,nw_TopEdge(a1)
  1150.         lea.l    nw_Title(a1),a0
  1151.         bsr.w    _Addr            Titeladresse korrigieren
  1152.         moveq.l    #-1,d1            cc setzen
  1153. .Exit        pull    d1-d6/a0/a1
  1154.         rts
  1155.  
  1156. .Error        clr.b    d0            cc setzen
  1157.         bra.b    .Exit
  1158.  
  1159. ;;-- auf IDCMP-Message warten --
  1160. ;    In:    a0 = *Window
  1161. ;    Out:    d0.b = Action (0-3 = dfx, 4 = Undo, 6 = Info, 8 = Quit/Exit)
  1162.  
  1163. _GetMsg        push    d0/d1/a0-a2/lb
  1164.         exec
  1165.         movea.l    wd_UserPort(a0),a2
  1166. .Flush        movea.l    a2,a0
  1167.         fjsr    GetMsg            vorher eingetroffene Messages
  1168.         tst.l    d0
  1169.         beq.b    .FlushEnd
  1170.         movea.l    d0,a1
  1171.         fjsr    ReplyMsg        ..beantworten
  1172.         bra.b    .Flush
  1173. .FlushEnd
  1174. .Loop        movea.l    a2,a0
  1175.         fjsr    WaitPort        auf Msg warten
  1176.         movea.l    a2,a0
  1177.         fjsr    GetMsg            ..und holen
  1178.         movea.l    d0,a1
  1179.         move.w    im_Class+2(a1),d1
  1180.         moveq.l    #GADGETUP,d0
  1181.         cmp.w    d0,d1
  1182.         beq.b    .Gadget            ..GadgetUp
  1183.         lsl.w    #2,d0
  1184.         cmp.w    d0,d1
  1185.         beq.b    .Menu            ..MenuPick
  1186.         lsl.w    #2,d0
  1187.         cmp.w    d0,d1
  1188.         beq.b    .RawKey            ..RawKey
  1189. .Close        move.b    #8,3(sp)        ..CloseWindow
  1190. .Exit        fjsr    ReplyMsg        Msg beantworten
  1191.         pull    d0/d1/a0-a2/lb
  1192.         rts
  1193.  
  1194. .Gadget        movea.l    im_IAddress(a1),a0
  1195.         move.b    gg_GadgetID+1(a0),3(sp)    Returncode = GadgetID
  1196.         bra.b    .Exit
  1197.  
  1198. .Menu        move.w    im_Code(a1),d1
  1199.         move.b    d1,d0
  1200.         andi.b    #%11111,d0
  1201.         bne.b    .Repeat            ..illegaler Strip
  1202.         move.w    d1,d0
  1203.         lsr.w    #5,d0
  1204.         andi.b    #%111111,d0
  1205.         beq.b    .SubMenu        ..SubMenu
  1206.         cmpi.b    #5,d0
  1207.         bgt.b    .Repeat            ..illegales Item
  1208.         addq.b    #3,d0
  1209.         move.b    d0,3(sp)        Return = ItemNummer+3
  1210.         bra.b    .Exit
  1211. .SubMenu    lsl.l    #5,d1
  1212.         swap.w    d1
  1213.         andi.b    #%11111,d1
  1214.         cmpi.b    #3,d1
  1215.         bgt.b    .Repeat            ..illegales Sub
  1216.         move.b    d1,3(sp)        Return = SubNummer
  1217.         bra.b    .Exit
  1218.  
  1219. .RawKey        move.b    im_Code+1(a1),d0
  1220.         cmpi.b    #$44,d0
  1221.         beq.b    .Close            ..Return
  1222.         cmpi.b    #$43,d0
  1223.         beq.b    .Close            ..Enter
  1224.         ;||
  1225. .Repeat        fjsr    ReplyMsg        Msg beantworten
  1226.         bra.w    .Loop            ..und wieder warten
  1227.  
  1228.  
  1229. ;;-- WaitPointer setzen --
  1230.  
  1231. _WaitPtr    push    d0-d3/a0/a1/lb
  1232.         slib    Intui
  1233.         movea.l    gl_Window(gl),a0
  1234.         movea.l    gl_ChipMem(gl),a1
  1235.         lea.l    chip_Pointer(a1),a1
  1236.         moveq.l    #16,d0
  1237.         moveq.l    #16,d1
  1238.         moveq.l    #-6,d2
  1239.         moveq.l    #0,d3
  1240.         fjsr    SetPointer        WaitPointer setzen
  1241.         pull    d0-d3/a0/a1/lb
  1242.         rts
  1243.  
  1244. ;;-- WaitPointer löschen --
  1245.  
  1246. _ClearPtr    push    d0/d1/a0/a1/lb
  1247.         slib    Intui
  1248.         movea.l    gl_Window(gl),a0
  1249.         fjsr    ClearPointer        normalen Pointer setzen
  1250.         pull    d0/d1/a0/a1/lb
  1251.         rts
  1252.  
  1253. ;;-- Gadgets & Menüs --
  1254. ; ACHTUNG: DFx-GGs müssen durch gg_NextGG verbunden sein (DF0<>DF1<>DF2<>DF3)!
  1255. ;       Genauso die DFx-Subs!
  1256. ; DFx-GGs und -Subs müssen DISABLED sein!
  1257.  
  1258. _GfxStart    sbase
  1259.  soff    NewWin
  1260.         dc.w    -1,-1,232+8,32+5
  1261.         dc.b    0,1
  1262.         dc.l    CLOSEWINDOW!MENUPICK!GADGETUP
  1263.         dc.l WINDOWDRAG!WINDOWCLOSE!WINDOWDEPTH!ACTIVATE!SMART_REFRESH
  1264.         dc.l    DF0Gadget,0,Title,0,0
  1265.         dc.w    232+8-8,32+5-4,-1,-1,-1
  1266.  soff    Title
  1267.          dc.b    'AntiRaBB V'
  1268.          version
  1269.          dc.b    0
  1270.          even
  1271.  
  1272.  soff    DF0Gadget,gfx_FirstGG
  1273. gfx_DF0GG    =    gfx_FirstGG
  1274.          dc.l    DF1Gadget
  1275.         dc.w    8+4,16+3,48,12
  1276.         dc.w    GADGDISABLED!GADGHCOMP,RELVERIFY,BOOLGADGET
  1277.         dc.l    DFxBorder,0,DF0IText,0,0
  1278.         dc.w    0
  1279.         dc.l    0
  1280.  
  1281.  soff    DF0IText
  1282.         dc.b    gl_TextPen,0,RP_JAM1,0
  1283.         dc.w    8,2
  1284.         dc.l    TopazFont,DF0Text,0
  1285.  
  1286.  soff    DF1Gadget
  1287.         dc.l    DF2Gadget
  1288.         dc.w    64+4,16+3,48,12
  1289.         dc.w    GADGDISABLED!GADGHCOMP,RELVERIFY,BOOLGADGET
  1290.         dc.l    DFxBorder,0,DF1IText,0,0
  1291.         dc.w    1
  1292.         dc.l    0
  1293.  
  1294.  soff    DF1IText
  1295.         dc.b    gl_TextPen,0,RP_JAM1,0
  1296.         dc.w    8,2
  1297.         dc.l    TopazFont,DF1Text,0
  1298.  
  1299.  soff    DF2Gadget
  1300.         dc.l    DF3Gadget
  1301.         dc.w    120+4,16+3,48,12
  1302.         dc.w    GADGDISABLED!GADGHCOMP,RELVERIFY,BOOLGADGET
  1303.         dc.l    DFxBorder,0,DF2IText,0,0
  1304.         dc.w    2
  1305.         dc.l    0
  1306.  
  1307.  soff    DF2IText
  1308.         dc.b    gl_TextPen,0,RP_JAM1,0
  1309.         dc.w    8,2
  1310.         dc.l    TopazFont,DF2Text,0
  1311.  
  1312.  soff    DF3Gadget
  1313.         dc.l    0
  1314.         dc.w    176+4,16+3,48,12
  1315.         dc.w    GADGDISABLED!GADGHCOMP,RELVERIFY,BOOLGADGET
  1316.         dc.l    DFxBorder,0,DF3IText,0,0
  1317.         dc.w    3
  1318.         dc.l    0
  1319.  
  1320.  soff    DF3IText
  1321.         dc.b    gl_TextPen,0,RP_JAM1,0
  1322.         dc.w    8,2
  1323.         dc.l    TopazFont,DF3Text,0
  1324.  
  1325.  soff    DFxBorder
  1326.         dc.w    0,0
  1327.         dc.b    gl_ShinePen,0,RP_JAM1,5
  1328.         dc.l    ShineXY,ShadowBorder
  1329.  soff    ShineXY
  1330.         dc.w    47,0, 0,0, 0,11, 1,10, 1,1
  1331.  
  1332.  soff    ShadowBorder
  1333.         dc.w    0,0
  1334.         dc.b    gl_ShadowPen,0,RP_JAM1,5
  1335.         dc.l    ShadowXY,0
  1336.  soff    ShadowXY
  1337.         dc.w    1,11, 47,11, 47,0, 46,1, 46,10
  1338.  
  1339.  soff    DF0Text
  1340.          dc.b    'df0:',0
  1341.  soff    DF1Text
  1342.          dc.b    'df1:',0
  1343.  soff    DF2Text
  1344.          dc.b    'df2:',0
  1345.  soff    DF3Text
  1346.          dc.b    'df3:',0
  1347.         even
  1348.  
  1349.  soff    TopazFont,gfx_TopazFont
  1350.         dc.l    TopazName
  1351.         dc.w    8
  1352.         dc.b    FS_NORMAL,FPF_ROMFONT
  1353.  soff    TopazName
  1354.          dc.b    'topaz.font',0
  1355.         even
  1356.  
  1357.  soff    InstallIText,gfx_FirstIText
  1358.         dc.b    gl_HiTextPen,0,RP_JAM1,0
  1359.         dc.w    8+4,4+3
  1360.         dc.l    TopazFont,InstallText,0
  1361.  soff    InstallText
  1362.         dc.b    'Installieren auf:',0
  1363.         even
  1364.  
  1365.  soff    ProjectMenu,gfx_FirstStrip
  1366.         dc.l    0
  1367.         dc.w    2,0,-1,-1,MENUENABLED
  1368.         dc.l    ProjectText,InstallItem
  1369.         dc.w    0,0,0,0
  1370.  soff    ProjectText
  1371.         dc.b    'Projekt',0
  1372.         even
  1373.  
  1374.  soff    InstallItem
  1375.         dc.l    UndoItem
  1376.         dc.w    0,0,-1,1,ITEMTEXT!ITEMENABLED!HIGHCOMP
  1377.         dc.l    0,InstallIText2,0
  1378.         dc.b    0,0
  1379.         dc.l    DF0Sub
  1380.         dc.w    0
  1381.  
  1382.  soff    InstallIText2
  1383.         dc.b    gl_BackPen,0,RP_JAM1,0
  1384.         dc.w    2,1
  1385.         dc.l    0,InstallText2,SubIText
  1386.  soff    InstallText2
  1387.         dc.b    'Installieren auf',0
  1388.         even
  1389.  
  1390.  soff    SubIText                '»'-IText
  1391.         dc.b    gl_BackPen,0,RP_JAM1,0
  1392.         dc.w    -3,1
  1393.         dc.l    0,SubText,0
  1394.  soff    SubText
  1395.         dc.b    '»',0
  1396.         even
  1397.  
  1398.  soff    UndoItem,gfx_UndoItem
  1399.         dc.l    DummyItem1
  1400.         dc.w    0,1,-1,1,ITEMTEXT!COMMSEQ!HIGHCOMP
  1401.         dc.l    0,UndoIText,0
  1402.         dc.b    'U',0
  1403.         dc.l    0
  1404.         dc.w    0
  1405.  
  1406.  soff    UndoIText
  1407.         dc.b    gl_BackPen,0,RP_JAM1,0
  1408.         dc.w    2,1
  1409.         dc.l    0,UndoText,0
  1410.  soff    UndoText
  1411.         dc.b    'Rückgängig machen',0
  1412.         even
  1413.  
  1414.  soff    DummyItem1            Zwischenbar-Item
  1415.         dc.l    InfoItem
  1416.         dc.w    0,2,-1,6,HIGHNONE
  1417.         dc.l    0,DummyImage,0
  1418.         dc.b    0,0
  1419.         dc.l    0
  1420.         dc.w    0
  1421.  
  1422.  soff    DummyImage
  1423.         dc.w    2,2,-1,2,0
  1424.         dc.l    0
  1425.         dc.b    0,0
  1426.         dc.l    0
  1427.  
  1428.  soff    InfoItem
  1429.         dc.l    DummyItem2
  1430.         dc.w    0,3,-1,1,ITEMTEXT!COMMSEQ!ITEMENABLED!HIGHCOMP
  1431.         dc.l    0,InfoIText,0
  1432.         dc.b    'I',0
  1433.         dc.l    0
  1434.         dc.w    0
  1435.  
  1436.  soff    InfoIText
  1437.         dc.b    gl_BackPen,0,RP_JAM1,0
  1438.         dc.w    2,1
  1439.         dc.l    0,InfoText,0
  1440.  soff    InfoText
  1441.         dc.b    'Information...',0
  1442.         even
  1443.  
  1444.  soff    DummyItem2            Zwischenbar-Item
  1445.         dc.l    QuitItem
  1446.         dc.w    0,4,-1,6,HIGHNONE
  1447.         dc.l    0,DummyImage,0
  1448.         dc.b    0,0
  1449.         dc.l    0
  1450.         dc.w    0
  1451.  
  1452.  soff    QuitItem
  1453.         dc.l    0
  1454.         dc.w    0,5,-1,1,ITEMTEXT!COMMSEQ!ITEMENABLED!HIGHCOMP
  1455.         dc.l    0,QuitIText,0
  1456.         dc.b    'Q',0
  1457.         dc.l    0
  1458.         dc.w    0
  1459.  
  1460.  soff    QuitIText
  1461.         dc.b    gl_BackPen,0,RP_JAM1,0
  1462.         dc.w    2,1
  1463.         dc.l    0,QuitText,0
  1464.  soff    QuitText
  1465.         dc.b    'Ende',0
  1466.         even
  1467.  
  1468.  soff    DF0Sub,gfx_DF0Sub
  1469.         dc.l    DF1Sub
  1470.         dc.w    0,0,-1,1,ITEMTEXT!COMMSEQ!HIGHCOMP
  1471.         dc.l    0,DF0IText2,0
  1472.         dc.b    '0',0
  1473.         dc.l    0
  1474.         dc.w    0
  1475.  
  1476.  soff    DF0IText2
  1477.         dc.b    gl_BackPen,0,RP_JAM1,0
  1478.         dc.w    2,1
  1479.         dc.l    0,DF0Text,0
  1480.  
  1481.  soff    DF1Sub
  1482.         dc.l    DF2Sub
  1483.         dc.w    0,1,-1,1,ITEMTEXT!COMMSEQ!HIGHCOMP
  1484.         dc.l    0,DF1IText2,0
  1485.         dc.b    '1',0
  1486.         dc.l    0
  1487.         dc.w    0
  1488.  
  1489.  soff    DF1IText2
  1490.         dc.b    gl_BackPen,0,RP_JAM1,0
  1491.         dc.w    2,1
  1492.         dc.l    0,DF1Text,0
  1493.  
  1494.  soff    DF2Sub
  1495.         dc.l    DF3Sub
  1496.         dc.w    0,2,-1,1,ITEMTEXT!COMMSEQ!HIGHCOMP
  1497.         dc.l    0,DF2IText2,0
  1498.         dc.b    '2',0
  1499.         dc.l    0
  1500.         dc.w    0
  1501.  
  1502.  soff    DF2IText2
  1503.         dc.b    gl_BackPen,0,RP_JAM1,0
  1504.         dc.w    2,1
  1505.         dc.l    0,DF2Text,0
  1506.  
  1507.  soff    DF3Sub
  1508.         dc.l    0
  1509.         dc.w    0,3,-1,1,ITEMTEXT!COMMSEQ!HIGHCOMP
  1510.         dc.l    0,DF3IText2,0
  1511.         dc.b    '3',0
  1512.         dc.l    0
  1513.         dc.w    0
  1514.  
  1515.  soff    DF3IText2
  1516.         dc.b    gl_BackPen,0,RP_JAM1,0
  1517.         dc.w    2,1
  1518.         dc.l    0,DF3Text,0
  1519.  
  1520.  soff    ReqNewWin,gfx_ReqNewWin
  1521.         dc.w    -1,-1,-1,-1
  1522.         dc.b    0,1
  1523.         dc.l    CLOSEWINDOW!GADGETUP!RAWKEY
  1524.     dc.l WINDOWDRAG!WINDOWCLOSE!WINDOWDEPTH!ACTIVATE!SMART_REFRESH!RMBTRAP
  1525.         dc.l    0,0,ReqTitle,0,0
  1526.         dc.w    56,43,$7fff,$7fff,CUSTOMSCREEN
  1527.  soff    ReqTitle
  1528.          dc.b    'Nachricht:',0
  1529.          even
  1530.  
  1531.  soff    ReqGadget,gfx_ReqGG
  1532.         dc.l    0
  1533.         dc.w    -1,-1-2-14,38,14,GADGHCOMP!GRELBOTTOM,RELVERIFY
  1534.         dc.w    BOOLGADGET
  1535.         dc.l    ReqGGBorder1,0,ReqGGIText,0,0
  1536.         dc.w    6
  1537.         dc.l    0
  1538.  
  1539.  soff    ReqGGBorder1
  1540.         dc.w    0,0
  1541.         dc.b    gl_ShinePen,0,RP_JAM1,3
  1542.         dc.l    ReqGGXY1,ReqGGBorder2
  1543.  soff    ReqGGXY1
  1544.         dc.w    36,0, 0,0, 0,12
  1545.  
  1546.  soff    ReqGGBorder2
  1547.         dc.w    0,0
  1548.         dc.b    gl_ShadowPen,0,RP_JAM1,3
  1549.         dc.l    ReqGGXY2,0
  1550.  soff    ReqGGXY2
  1551.         dc.w    1,13, 37,13, 37,1
  1552.  
  1553.  soff    ReqBorder1,gfx_ReqBorder
  1554.         dc.w    0,0
  1555.         dc.b    gl_ShadowPen,0,RP_JAM1,3
  1556.         dc.l    ReqXY1,ReqBorder2
  1557.  soff    ReqXY1,gfx_ReqXY1
  1558.         dc.w    -1,-1, -1,-1, -1,-1
  1559.  
  1560.  soff    ReqBorder2
  1561.         dc.w    0,0
  1562.         dc.b    gl_ShinePen,0,RP_JAM1,3
  1563.         dc.l    ReqXY2,0
  1564.  soff    ReqXY2,gfx_ReqXY2
  1565.         dc.w    -1,-1, -1,-1, -1,-1
  1566.  
  1567.  soff    ReqGGIText
  1568.         dc.b    gl_TextPen,0,RP_JAM1,0
  1569.         dc.w    3+4,3
  1570.         dc.l    TopazFont2,ReqGGText,0
  1571.  soff    ReqGGText
  1572.         dc.b    'Jöp',0
  1573.  
  1574.  soff    TopazFont2            wie TopazFont, allerdings Fettdruck
  1575.         dc.l    TopazName
  1576.         dc.w    8
  1577.         dc.b    FSF_BOLD,FPF_ROMFONT
  1578.  
  1579.  soff    ReqIText,gfx_ReqIText        für Requester, nicht mit _IText berech.
  1580.         dc.b    -1,0,RP_JAM1,0
  1581.         dc.w    0,-1
  1582.         dc.l    -1,0,0
  1583.  
  1584.  soff    TDERR20,gfx_TDERR20        Zeiger auf die TDERR-Texte
  1585.         dc.l    TDERR20Txt
  1586.  soff    TDERR21,gfx_TDERR21
  1587.         dc.l    TDERR21Txt
  1588.  soff    TDERR22,gfx_TDERR22
  1589.         dc.l    TDERR22Txt
  1590.  soff    TDERR23,gfx_TDERR23
  1591.         dc.l    TDERR23Txt
  1592.  soff    TDERR24,gfx_TDERR24
  1593.         dc.l    TDERR24Txt
  1594.  soff    TDERR25,gfx_TDERR25
  1595.         dc.l    TDERR25Txt
  1596.  soff    TDERR26,gfx_TDERR26
  1597.         dc.l    TDERR26Txt
  1598.  soff    TDERR27,gfx_TDERR27
  1599.         dc.l    TDERR27Txt
  1600.  soff    TDERR28,gfx_TDERR28
  1601.         dc.l    TDERR28Txt
  1602.  soff    TDERR29,gfx_TDERR29
  1603.         dc.l    TDERR29Txt
  1604.  soff    TDERR30,gfx_TDERR30
  1605.         dc.l    TDERR30Txt
  1606.  soff    TDERR31,gfx_TDERR31
  1607.         dc.l    TDERR31Txt
  1608.  soff    TDERR32,gfx_TDERR32
  1609.         dc.l    TDERR32Txt
  1610.  soff    TDERR33,gfx_TDERR33
  1611.         dc.l    TDERR33Txt
  1612.  soff    TDERR34,gfx_TDERR34
  1613.         dc.l    TDERR34Txt
  1614.  soff    TDERR35,gfx_TDERR35
  1615.         dc.l    TDERR35Txt
  1616.  
  1617.  soff    TDERR20Txt
  1618.         dc.b    'Ursache unbekannt',0
  1619.  soff    TDERR21Txt
  1620.         dc.b    'kein Sectorheader gefunden',0
  1621.  soff    TDERR22Txt
  1622.         dc.b    'fehlerhafte SectorPreamble',0
  1623.  soff    TDERR23Txt
  1624.         dc.b    'fehlerhafte SectorID',0
  1625.  soff    TDERR24Txt
  1626.         dc.b    'falsche Header Checksumme',0
  1627.  soff    TDERR25Txt
  1628.         dc.b    'falsche Sector Checksumme',0
  1629.  soff    TDERR26Txt
  1630.         dc.b    'zuwenig Sectoren auf Track',0
  1631.  soff    TDERR27Txt
  1632.         dc.b    'SectorHeader unlesbar',0
  1633.  soff    TDERR28Txt
  1634.         dc.b    'Disk ist schreibgeschützt',0
  1635.  soff    TDERR29Txt
  1636.         dc.b    'keine Disk im Laufwerk',0
  1637.  soff    TDERR30Txt
  1638.         dc.b    'Lesekopfpositionierung falsch',0
  1639.  soff    TDERR31Txt
  1640.         dc.b    'kein freier Speicher',0
  1641.  soff    TDERR32Txt
  1642.         dc.b    'Laufwerk nicht angeschlossen',0
  1643.  soff    TDERR33Txt
  1644.         dc.b    'unbekannter Laufwerkstyp',0
  1645.  soff    TDERR34Txt
  1646.         dc.b    'Laufwerk wird gerade benutzt',0
  1647.  soff    TDERR35Txt
  1648.         dc.b    'illegaler Zugriff nach Reset',0
  1649.  
  1650. _GfxEnd
  1651.  
  1652. ;;-- ChipRam-Daten --
  1653.  
  1654. _ChipStart    sbase        \
  1655.  soff    ChipImage,chip_Tropic    /
  1656.         dc.w    4+5+9,3+2+5,145,38,2
  1657.         dc.l    ChipImageData
  1658.         dc.b    %11,0
  1659.         dc.l    0
  1660.  soff    ChipImageData
  1661.         incdir    'sys:asm/src/'
  1662.         incbin    'TropicDesign.raw'    (145x38x2)
  1663.  
  1664.  soff    ChipPtr,chip_Pointer
  1665.         dc.w    0,0
  1666.         dc.w    %0000010000000000,%0000011111000000
  1667.         dc.w    %0000000000000000,%0000011111000000
  1668.         dc.w    %0000000100000000,%0000001110000000
  1669.         dc.w    %0000000000000000,%0000011111100000
  1670.         dc.w    %0000011111000000,%0001111111111000
  1671.         dc.w    %0001111111110000,%0011111111101100
  1672.         dc.w    %0011111111111000,%0111111111011110
  1673.         dc.w    %0011111111111000,%0111111110111110
  1674.         dc.w    %0111111111111100,%1111111101111111
  1675.         dc.w    %0111111011111100,%1111111111111111
  1676.         dc.w    %0111111111111100,%1111111111111111
  1677.         dc.w    %0011111111111000,%0111111111111110
  1678.         dc.w    %0011111111111000,%0111111111111110
  1679.         dc.w    %0001111111110000,%0011111111111100
  1680.         dc.w    %0000011111000000,%0001111111111000
  1681.         dc.w    %0000000000000000,%0000011111100000
  1682.         dc.w    0,0
  1683. _ChipEnd
  1684.  
  1685. ;;-- Weitere Konstanten (Fucking ASM-One will sie hier unten haben) --
  1686.  
  1687.         rsreset        ;\
  1688. gl_Pens        rs.b    0      \
  1689. gl_TextPen    rs.b    1       \    Farbverteilungen
  1690. gl_ShinePen    rs.b    1        >
  1691. gl_ShadowPen    rs.b    1       /
  1692. gl_HiTextPen    rs.b    1      /
  1693. gl_BackPen    rs.b    1     /
  1694. gl_Return    rs.b    1        CLI-Returncode
  1695.         rsword
  1696. gl_Result2    rs.l    1        2. Returncode
  1697. gl_Process    rs.l    1        eigener Process
  1698. gl_WBMsg    rs.l    1        Workbench-StartupMsg
  1699. gl_IntuiBase    rs.l    1
  1700. gl_GfxBase    rs.l    1
  1701. gl_Floppy0    rs.b    flo_SIZEOF    \    darf nicht größer als 127 sein!
  1702. gl_Floppy1    rs.b    flo_SIZEOF     \
  1703. gl_Floppy2    rs.b    flo_SIZEOF     /
  1704. gl_Floppy3    rs.b    flo_SIZEOF    /
  1705. gl_Floppies    rs.b    1        Bit gesetzt=IOReq. exist.,Bit0=df0 etc.
  1706. gl_UndoFloppy    rs.b    1        Unitnummer des Undobufferce
  1707.         rsword
  1708. gl_UndoChange    rs.l    1        DiskChangeCount zur Lese-Zeit
  1709. gl_Window    rs.l    1        eigenes Window
  1710. gl_BarFont    rs.l    1        TextAttr für Menüs/WindowTitle
  1711. gl_BarHeight    rs.w    1        ta_YSize "   "     "
  1712. gl_SubWidth    rs.w    1        Breite des '»' Zeichens
  1713. gl_ScrWidth    rs.w    1    \    Screen-Dimensionen
  1714. gl_ScrHeight    rs.w    1    /
  1715. gl_ChipMem    rs.l    1        Zeiger auf chip-Struktur (s. u.)
  1716. gl_SIZE        rs.b    0            \
  1717.                         ;\
  1718.         rs.b    _GfxEnd-_GfxStart     /    Gadgets, Menüs etc.
  1719. gl_SIZEOF    rs.b    0            /
  1720.  
  1721.         rsreset                ;\
  1722.         rs.b    _ChipEnd-_ChipStart      >
  1723. chip_SIZE    rs.b    0             /
  1724. chip_UndoBuf    rs.b    BB_SIZEOF        Undo-Puffer      <-----\
  1725. chip_ReadBuf    rs.b    BB_SIZEOF        gelesener Puffer       |
  1726. chip_SIZEOF    rs.b    0
  1727.